/*********************************
 *客户端 ：client.c
 *作者：huawenyao
 *时间:2021年3月9日
 *文件修改版本：第一次修改
 *文件修改日志: 多线程并发服务器的测试端
 * *******************************/

#include <stdio.h>
#include <net/if.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>

#define SERV_PORT  5566
#define SERV_IP_ADDR "127.0.0.1"
#define QUIT "quit"



int main(int argc, char *argv[])
{
	printf("argc=%d,argv[0]=%s\n",argc,argv[0]);
  //创建套接字
  int fd = -1;
  fd = socket(AF_INET,SOCK_STREAM,0);
  if (fd<0) {
    perror("");
    exit(1);
  }
  fprintf(stderr, "create socket succeed\n");

  //创建地址信息结构体，并填充
  struct sockaddr_in sin;
  bzero(&sin,sizeof(sin));
  sin.sin_family = AF_INET;
  sin.sin_port   = htons(SERV_PORT);
  if (inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1) {
    perror("inet_pton");
    exit(2);
  }
  fprintf(stderr, "填充结构体成功\n");

  //连接到服务器
  if (connect(fd,(struct sockaddr*)&sin,sizeof(sin)) <0) {
    perror("connect");
    exit(3);
  }
  fprintf(stderr, "连接成功\n");

  char buf[BUFSIZ]={};
  int ret =-1;
  while (1) {
    bzero(buf,BUFSIZ);
    if(fgets(buf,BUFSIZ-1,stdin)==NULL) {
      continue;
    }
   //发送
    do{
      ret = send(fd,buf,strlen(buf),0);
    }while(ret<0 && EINTR == errno);

    if(ret<0) {
      perror("send");
      exit(5);
    } else if(!ret) {
      fprintf(stderr, "对方正常关闭\n");
      break;
    }
	//接受
	do{
		ret = recv(fd,buf,sizeof(buf),0);
	}while(ret<0&&EINTR == errno);
	if(ret <0)
	{
		perror("recv");
	}else if(!ret)
	{
	printf("对方正常关闭\n");
	}
    if (!strncasecmp(buf,QUIT,strlen(QUIT))) {
      fprintf(stderr, "客户端已退出\n");
      break;
    }
  }

  close(fd);	
	return 0;
}

